/*
* Copyright 2016 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.pdfbox.debugger.ui;
import java.awt.Color;
import java.awt.Frame;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
/**
* Custom log dialog.
*
* @author John Hewson
*/
public class LogDialog extends JDialog
{
private static LogDialog instance;
public static void init(Frame owner, JLabel logLabel)
{
instance = new LogDialog(owner, logLabel);
}
public static LogDialog instance()
{
return instance;
}
private final JLabel logLabel;
private final JTextPane textPane;
private JScrollPane scrollPane;
private int fatalCount = 0;
private int errorCount = 0;
private int warnCount = 0;
private int otherCount = 0;
private int exceptionCount = 0;
private LogDialog(Frame owner, JLabel logLabel)
{
super(owner);
this.logLabel = logLabel;
textPane = new JTextPane();
scrollPane = new JScrollPane(textPane);
getContentPane().add(scrollPane);
this.pack();
}
public void log(String name, String level, Object o, Throwable throwable)
{
StyledDocument doc = textPane.getStyledDocument();
String levelText;
SimpleAttributeSet levelStyle = new SimpleAttributeSet();
if (level.equals("fatal"))
{
levelText = "Fatal";
StyleConstants.setForeground(levelStyle, Color.WHITE);
StyleConstants.setBackground(levelStyle, Color.BLACK);
fatalCount++;
}
else if (level.equals("error"))
{
levelText = "Error";
StyleConstants.setForeground(levelStyle, new Color(0xFF291F));
StyleConstants.setBackground(levelStyle, new Color(0xFFF0F0));
errorCount++;
}
else if (level.equals("warn"))
{
levelText = "Warning";
StyleConstants.setForeground(levelStyle, new Color(0x614201));
StyleConstants.setBackground(levelStyle, new Color(0xFFFCE5));
warnCount++;
}
else if (level.equals("info"))
{
levelText = "Info";
StyleConstants.setForeground(levelStyle, new Color(0x203261));
StyleConstants.setBackground(levelStyle, new Color(0xE2E8FF));
otherCount++;
}
else if (level.equals("debug"))
{
levelText = "Debug";
StyleConstants.setForeground(levelStyle, new Color(0x32612E));
StyleConstants.setBackground(levelStyle, new Color(0xF4FFEC));
otherCount++;
}
else if (level.equals("trace"))
{
levelText = "Trace";
StyleConstants.setForeground(levelStyle, new Color(0x64438D));
StyleConstants.setBackground(levelStyle, new Color(0xFEF3FF));
otherCount++;
}
else
{
throw new Error(level);
}
SimpleAttributeSet nameStyle = new SimpleAttributeSet();
StyleConstants.setForeground(nameStyle, new Color(0x6A6A6A));
String shortName = name.substring(name.lastIndexOf('.') + 1);
String message = o.toString();
if (throwable != null)
{
StringWriter sw = new StringWriter();
throwable.printStackTrace(new PrintWriter(sw));
message += "\n " + sw.toString();
exceptionCount++;
}
try
{
doc.insertString(doc.getLength(), " " + levelText + " ", levelStyle);
doc.insertString(doc.getLength(), " [" + shortName + "]", nameStyle);
doc.insertString(doc.getLength(), " " + message + "\n", null);
}
catch (BadLocationException e)
{
throw new Error(e);
}
textPane.setCaretPosition(doc.getLength());
// update status bar with new counts
updateStatusBar();
}
private void updateStatusBar()
{
List<String> infos = new ArrayList<>();
if (exceptionCount > 0)
{
infos.add(exceptionCount + " exception" + (errorCount > 1 ? "s" : ""));
}
if (fatalCount > 0)
{
infos.add(errorCount + " error" + (errorCount > 1 ? "s" : ""));
}
if (errorCount > 0)
{
infos.add(errorCount + " error" + (errorCount > 1 ? "s" : ""));
}
if (warnCount > 0)
{
infos.add(warnCount + " warning" + (warnCount > 1 ? "s" : ""));
}
if (otherCount > 0)
{
infos.add(otherCount + " message" + (otherCount > 1 ? "s" : ""));
}
String info = "";
for (String str : infos)
{
if (info.length() > 0)
{
info += ", ";
}
info += str;
}
logLabel.setText(info);
}
public void clear()
{
fatalCount = 0;
errorCount = 0;
warnCount = 0;
otherCount = 0;
exceptionCount = 0;
textPane.setText("");
logLabel.setText("");
}
}